// create by hrj
// Current time: 2025-03-17 16:13:01.216
#include "../headFile.h"
// 课程表

class Solution {
public:
    bool canFinish(int n, vector<vector<int>>& prerequisites) {
        unordered_map<int,vector<int>> graph;
        vector<int> indegree(n);// 表示每个值的入度
        // 建图
        for(auto& e : prerequisites)
        {
            int a = e[0], b = e[1];
            // b->a的edge
            graph[b].push_back(a);
            indegree[a]++;
        }
        // 拓扑排序
        // 1. 入度为零的点加入队列
        queue<int> q;
        for(int i = 0;i < n;i++)
        {
            if(indegree[i] == 0) q.push(i);
            
        }
        // bfs
        while(!q.empty())
        {
            int t = q.front(); q.pop();
            // 不需要最终序列,可以省略
            for(auto& i : graph[t])
            {
                indegree[i]--;
                if(indegree[i] == 0) q.push(i);
            }
        }

        for(int i = 0;i < n;i++)
            if(indegree[i]) return false;
            
        return true;
    }
};